Amazon Kendra と OpenAI により最新の AWS ユーザーガイドに基づいて回答するチャットアプリケーションのサンプルを試してみた
Amazon Kendra と OpenAI などを利用して、AWS の最新のユーザーガイドに基づいた回答をしてもらえるチャットのサンプルアプリケーションが AWS Samples に公開されたため試してみました。
実際に構築して試してみたチャット画面です。Amazon Kendra が対応しているドキュメントタイプを質問し、ソースとなるユーザーガイドの URL と共に回答してくれました。回答に含まれている Microsoft Excel は 2023 年 1 月に対応したドキュメントタイプです。
サンプルアプリケーションは次のリポジトリにあります。
OpenAI 以外にも次の AI に対応しています。
- Hugging Face
- AI21 Labs
- Cohere
- Anthropic
- OpneAI
サンプルの使い方を紹介している AWS ブログもあります。このブログを参考にサンプルアプリケーションの構築を試してみました。
2023.5.16 追記
AWS ブログの日本語翻訳版も公開されました
始めに構築するサンプルアプリケーションの構成を説明した後に、構築を試してみます。
構成図
本ブログで構築するサンプルアプリケーションの構成図を AWS ブログから抜粋して掲載します。
ユーザーがチャットで問い合わせると、アプリケーションが AWS ユーザーガイドの情報を取り込んだ Amazon Kendra にアクセスし、その回答を OpneAI に渡すことで、ユーザーへの回答を生成します。
サンプルアプリケーションの構築
冒頭で紹介した AWS ブログに記載されている手順 に沿って構築してみたいと思います。
今回利用したソフトウェアのバージョンは次の通りです。
- Python 3.9.16
- boto3 1.26.130
- Streamlit 1.22.0
- openai 0.27.6
- langchain 0.0.163
アプリケーションを実行する環境は AWS Cloud9 を利用しました。主な設定は次の通りです。
- インスタンスサイズ
t2.micro
- Platform
Amazon Linux 2
Amazon Kendra の構築
サンプル用に CloudFormation テンプレートが用意されているため、今回は用意されているテンプレートを利用します。
AWS CloudShell に上記テンプレートをアップロードした後に次のコマンドで作成します。
aws cloudformation create-stack \ --region ap-northeast-1 \ --stack-name demo-kendora \ --template-body file://kendra-docs-index.yaml \ --capabilities CAPABILITY_NAMED_IAM
環境構築には 45 分ほどかかります。
完了後は Kendra のインデックスとデータソース、データソースとの同期を実行する Lambda、および、関連する IAM ロールが作成されます。
Kendra のデータソースのタイプはWebCrawler connector
であり、AWS ユーザーガイドの次の 3 つのサイトマップがクローリング先として設定されています。
https://docs.aws.amazon.com/sagemaker/latest/dg/sitemap.xml https://docs.aws.amazon.com/lex/latest/dg/sitemap.xml https://docs.aws.amazon.com/kendra/latest/dg/sitemap.xml
同期処理に関して、いくつかのソースがFailed
になっていましたが、Added
のソースも多いためこのまま進めたいと思います。
データソースとの同期スケジュールはRun on demand
で設定されており、定期的な同期は実施されません。この設定の場合は手動で同期が必要なため、AWS Lambda を利用して構築時に同期が実行されています。おそらく、Web クローリングをむやみに実行しないように考慮しているのだと思います。
なお、AWS ブログ上では、Amazon Kendora のクォータ増加のリクエストすることでエクスペリエンスが向上するとの記載がありますが、今回は実施しません。
Web アプリケーションの構築
AWS Cloud9 上でサンプルの Web アプリケーションを構築していきます。
Python
AWS ブログに Python 3.9 以降と指定があるため、Python のバージョンを変更します。現状のバージョンは次の通りです。
$ python --version Python 3.7.16
Cloud9 上の Python のバージョン変更は次のブログを参考にして実施しました。
pyenv をインストールします。
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv $ ~/.pyenv/bin/pyenv --version pyenv 2.3.17-9-g528d10e9 $ cat << 'EOT' >> ~/.bashrc export PATH="$HOME/.pyenv/bin:$PATH" eval "$(pyenv init -)" EOT $ source ~/.bashrc $ pyenv versions * system (set by /home/ec2-user/.pyenv/version)
Python 3.9.16(最新バージョン)をインストールしてバージョンを切り替えます。
$ sudo yum -y update $ sudo yum -y install bzip2-devel $ sudo yum -y install xz-devel $ pyenv install 3.9.16 $ pyenv versions * system (set by /home/ec2-user/.pyenv/version) 3.9.16 $ pyenv global 3.9.16 $ pyenv versions system * 3.9.16 (set by /home/ec2-user/.pyenv/version) $ python --version Python 3.9.16
boto3
AWS SDK for Python (Boto3) をインストールします。
次のページに従ってインストールします。
必要に応じて、pip をアップグレードします。
$ /home/ec2-user/.pyenv/versions/3.9.16/bin/python3.9 -m pip install --upgrade pip
boto3 をインストールします。
$ pip3 install boto3 $ pip3 list | grep boto3 boto3 1.26.130
Streamlit
Python で Web アプリケーションを作成するための Streamlit をインストールします。
次のページに従ってインストールします。
$ pip3 install streamlit $ streamlit --version Streamlit, version 1.22.0
ローカル環境で Web サイトが閲覧できるか確認します。
$ streamlit hello --server.port 8080
上記コマンド実行後に、AWS Cloud9 のPreview
→Preview Running Applicaiton
を選択すると閲覧できます。
インストール時にも出力されますが、Streamlit は使用統計を収集します。オプトアウトしたい場合は、設定ファイルに次の内容を追記します。
[browser] gatherUsageStats = false
設定ファイルがない場合は次のコマンドで作成できます。
$ mkdir ~/.streamlit $ vi ~/.streamlit/config.toml
使用統計の収集のオプトアウト設定については次のページに記載があります。
Configuration - Streamlit Docs
OpenAI, LangChain
LangChain は次のページに従ってインストールします。
OpneAI をインストールします。API キーの環境変数は後で設定します。
$ pip3 install openai $ openai --version openai 0.27.6
LangChain をインストールします。
$ pip3 install langchain $ pip3 list | grep langchain langchain 0.0.163
サンプルアプリケーション
次のリポジトリのREADME.md
に従って構築します。
GitHub からクローンして構築していきます。
$ pwd /home/ec2-user $ git clone https://github.com/aws-samples/amazon-kendra-langchain-extensions.git $ cd amazon-kendra-langchain-extensions $ pip3 install . $ pip3 install ".[samples]"
環境変数を設定します。
$ export AWS_REGION="ap-northeast-1" $ export KENDRA_INDEX_ID="dd6d896b-704e-46f9-9ab6-5adffexample" $ export OPENAI_API_KEY="..."
REGION
は Amazon Kendra を構築しているリージョンを指定します。今回の場合は Amazon Kendra を構築する CloudFormation スタックを作成したリージョンです。
KENDRA_INDEX_ID
は Amazon Kendra のインデックスの ID を指定します。マネジメントコンソールから確認するか次のコマンドで確認します。
$ aws kendra list-indices { "IndexConfigurationSummaryItems": [ { "Status": "ACTIVE", "Name": "demo-kendora-Index", "Edition": "DEVELOPER_EDITION", "UpdatedAt": 1683642249.785, "Id": "dd6d896b-704e-46f9-9ab6-5adffexample", "CreatedAt": 1683642249.785 } ] }
OPENAI_API_KEY
は OpenAI の API キーを指定します。本ブログ上ではマスキングしています。
サンプルアプリケーションを実行します。
$ cd samples $ streamlit run app.py openai --server.port 8080
AWS Cloud9 のPreview
→Preview Running Applicaiton
を選択すると閲覧できます。
後は質問するだけです。
動作確認
Amazon Kendra のデータソースとして次の AWS サービスのユーザーガイドを取り込んでいるため、関連する質問をしてみます。
- Amazon Lex
- Amazon SageMaker
- Amazon Kendra
Amazon Kendra が対応している全てのドキュメントタイプを聞いてみました。
ソースとして提示されている 2 つ目のリンクに得たい情報がありました。
Unstructured text
Amazon Kendra supports the following types of unstructured text:
- HTML files
- Microsoft PowerPoint (PPT) presentations
- MS WORD documents
- Plain text documents
- PDFs
- Comma Separated Values (CSV) files
- Microsoft Excel (MS EXCEL) files
- XML files
- JSON files
- Markdown Documentation (MD) files
- Rich Text Format (RTF) files
- Extensible Stylesheet Language Transformation (XSLT) files
引用元:Types of documents - Amazon Kendra
チャットの回答とリンク先を見比べてみると JSON が抜けていたものの 2023 年 1 月に対応した Microsoft Excel などが含まれています。
追加で JSON に対応しているかを聞いてみました。
No との回答ですが、JSON はプレーンテキストとして扱われるとのことでした。ソースのユーザーガイドにもその旨の記載がありました。なるほど、と思いました。
If you want to use a JSON file for your set of frequently asked questions and answers, JSON files are treated as plain text and is a type of unstructured text.
よくある質問と回答に JSON ファイルを使用する場合、JSON ファイルはプレーンテキストとして扱われ、非構造化テキストの一種です。
引用元:Types of documents - Amazon Kendra
以上で、サンプルアプリケーションのお試しは終わりです。
(補足)Amazon Kendra の料金
Amazon Kendra の料金は次のページで確認できます。
Developer Edition でインデックスを構築する場合に1.125 USD/時間
かかり、1 日(24 時間)に換算すると27 USD/日
です。また、コネクタの同期やスキャンしたドキュメントにも追加料金があります。
そのため、事前に料金を確認してから試すことをおすすめします。
さいごに
AWS が公開している、Amazon Kendra と OpenAI、Langchain などを利用して、AWS の最新のユーザーガイドに基づいた回答をしてもらえるチャットのサンプルアプリケーションを試してみました。
今回の構築では、Amazon Kendra に AWS ユーザーガイドを取り込みましたが、S3 に社内ドキュメントやマニュアルなどを格納して Kendra に取り込むこともできるので独自のドキュメントに基づいたチャットもできそうです。
以上、このブログがどなたかのご参考になれば幸いです。